package chapter007.point01;

/**
 * Java 类
 * 用关键字 class修饰的就是类, 类是某些事物的统称, 比如人类
 * 所有的类祖先类都是Object, 也就是所有的类都继承自Object类
 *
 * @author Jack魏
 */
public class Point01 extends Object{
    public static void main(String[] args) {
        // 创建了一个人类对象, 具体到某个人
        Human human = new Human();
        // 人类对象具体到名字是Jack
        human.setName("Jack");
        // 年龄是18岁
        human.setAge(18);
        System.out.println("---------------------------1.普通类使用-------------------------------------");
        // 类属性的使用
        System.out.println("初始化人类对象, 姓名是: " + human.getName());
        System.out.println("初始化人类对象, 年龄是: " + human.getAge());
        System.out.println("-------------------------------2.内部类使用---------------------------------");
        // 内部类使用
        Human.Phone humanPhone = human.new Phone();
        humanPhone.setPhoneNum("17788889999");
        System.out.println(human.getName() + " 的手机号是:" + humanPhone.getPhoneNum());
        System.out.println("-----------------------------3.抽象类使用-----------------------------------");
        // 抽象类的使用
        /**
         * 1. 抽象类不能被实例化(初学者很容易犯的错)，如果被实例化，就会报错，编译无法通过。只有抽象类的非抽象子类可以创建对象。
         *
         * 2. 抽象类中不一定包含抽象方法，但是有抽象方法的类必定是抽象类。
         *
         * 3. 抽象类中的抽象方法只是声明，不包含方法体，就是不给出方法的具体实现也就是方法的具体功能。
         *
         * 4. 构造方法，类方法（用 static 修饰的方法）不能声明为抽象方法。
         *
         * 5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现，除非该子类也是抽象类。
         */
        /* 以下是不允许的，会引发错误 */
//        Employee e = new Employee("George W.", "Houston, TX", 43);

        Salary s = new Salary("小魏", "杭州", 3, 3600.00);
        Employee e = new Salary("小张", "上海", 2, 2400.00);

        System.out.println("Salary 类调用 发工资方法 --");
        s.mailCheck();
        System.out.println();
        System.out.println("Employee 实例调用 发工资方法--");
        e.mailCheck();

        System.out.println("-----------------------------4.匿名类使用-----------------------------------");
        /**
         * new 出来一个实例 没有变量接收
         * 然后直接调用
         */
        new Salary("@.@", "未知地点",88, 6666) {
            @Override
            public double computePay() {
                System.out.println("我是由匿名类计算: " + getName() + " 所得工资: " + getSalary());
                return getSalary();
            }
        }.computePay();
    }
}
